// openfdaService.ts
// 用于与openFDA API通信的服务模块

// 替换为您的实际API密钥
const API_KEY = 'fvkjVz7kngntmPlVG458RjR1YfoAy5862xE3Awen';
const BASE_URL = 'https://api.fda.gov/drug/label.json';

import tencentTranslateService from './tencentTranslateService';

/**
 * 将中文药物名称转换为英文名称（使用腾讯翻译API）
 * @param drugName 药物名称
 * @returns 英文药物名称或原始名称
 */
async function translateDrugName(drugName: string): Promise<string> {
  const trimmedName = drugName.trim();
  
  try {
    // 使用腾讯翻译API将中文药物名称翻译为英文
    const translatedName = await tencentTranslateService.translateText(trimmedName, 'en');
    console.log(`药物名称翻译: "${trimmedName}" -> "${translatedName}"`);
    return translatedName;
  } catch (error) {
    console.error('药物名称翻译失败，使用原始名称:', error);
    return trimmedName;
  }
}

/**
 * 根据药物名称搜索药物标签信息
 * @param drugName 药物名称
 * @param limit 返回结果数量限制
 * @returns Promise包含药物标签数据
 */
export async function searchDrugLabelByDrugName(drugName: string, limit: number = 5) {
  try {
    // 尝试使用英文名称进行搜索
    const englishName = await translateDrugName(drugName);
    const encodedDrugName = encodeURIComponent(englishName);
    let response = await fetch(
      `${BASE_URL}?api_key=${API_KEY}&search=openfda.brand_name:"${encodedDrugName}"&limit=${limit}`
    );
    
    // 如果英文名称搜索失败且与原始名称不同，尝试使用原始名称
    if (!response.ok && englishName !== drugName) {
      const encodedOriginalName = encodeURIComponent(drugName);
      response = await fetch(
        `${BASE_URL}?api_key=${API_KEY}&search=openfda.brand_name:"${encodedOriginalName}"&limit=${limit}`
      );
    }
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    const data = await response.json();
    return data;
  } catch (error) {
    console.error('获取药物标签数据时出错:', error);
    throw error;
  }
}

/**
 * 根据药物名称搜索药物相互作用信息
 * @param drugName 药物名称
 * @param limit 返回结果数量限制
 * @returns Promise包含药物相互作用数据
 */
export async function searchDrugInteractionsByDrugName(drugName: string, limit: number = 5) {
  try {
    // 尝试使用英文名称进行搜索
    const englishName = await translateDrugName(drugName);
    const encodedDrugName = encodeURIComponent(englishName);
    // 正确构建URL，确保所有参数都被正确编码
    let url = `${BASE_URL}?api_key=${API_KEY}&search=openfda.brand_name:%22${encodedDrugName}%22+AND+_exists_:drug_interactions&limit=${limit}`;
    
    console.log(`搜索药物相互作用信息 URL:`, url);
    
    let response = await fetch(url);
    
    // 如果英文名称搜索失败且与原始名称不同，尝试使用原始名称
    if (!response.ok && englishName !== drugName) {
      const encodedOriginalName = encodeURIComponent(drugName);
      url = `${BASE_URL}?api_key=${API_KEY}&search=openfda.brand_name:%22${encodedOriginalName}%22+AND+_exists_:drug_interactions&limit=${limit}`;
      
      console.log(`使用原始名称重新搜索 URL:`, url);
      
      response = await fetch(url);
    }
    
    console.log(`API响应状态:`, response.status);
    
    if (!response.ok) {
      throw new Error(`HTTP error! status: ${response.status}`);
    }
    
    const data = await response.json();
    console.log(`API返回数据:`, data);
    
    return data;
  } catch (error) {
    console.error('获取药物相互作用数据时出错:', error);
    throw error;
  }
}

/**
 * 获取特定药物的详细相互作用信息
 * @param drugName 药物名称
 * @returns Promise包含药物相互作用详情
 */
export async function getDrugInteractionsDetails(drugName: string) {
  try {
    const data = await searchDrugInteractionsByDrugName(drugName, 1);
    
    if (data.results && data.results.length > 0) {
      const drugLabel = data.results[0];
      return {
        drugName: drugName,
        drugInteractions: drugLabel.drug_interactions || [],
        warnings: drugLabel.warnings || [],
        precautions: drugLabel.precautions || []
      };
    }
    
    return null;
  } catch (error) {
    console.error('获取药物相互作用详情时出错:', error);
    throw error;
  }
}

/**
 * 检查两种药物之间可能的相互作用
 * @param drug1 第一种药物名称
 * @param drug2 第二种药物名称
 * @returns Promise包含相互作用分析结果
 */
export async function checkDrugDrugInteraction(drug1: string, drug2: string) {
  try {
    console.log(`检查药物相互作用: ${drug1} 与 ${drug2}`);
    
    // 分别获取两种药物的信息
    const [drug1Data, drug2Data] = await Promise.all([
      searchDrugInteractionsByDrugName(drug1, 1),
      searchDrugInteractionsByDrugName(drug2, 1)
    ]);
    
    console.log(`药物数据获取结果:`, { drug1Data, drug2Data });
    
    const interactions = [];
    
    // 检查第一种药物的标签中是否提及第二种药物
    if (drug1Data.results && drug1Data.results.length > 0) {
      const drug1Label = drug1Data.results[0];
      console.log(`药物${drug1}的标签数据:`, drug1Label);
      
      if (drug1Label.drug_interactions) {
        const interactionText = drug1Label.drug_interactions.join(' ').toLowerCase();
        const englishName2 = (await translateDrugName(drug2)).toLowerCase();
        console.log(`检查${drug1}中是否包含${drug2}或${englishName2}:`, {
          interactionText,
          drug2: drug2.toLowerCase(),
          englishName2
        });
        
        if (interactionText.includes(drug2.toLowerCase()) || interactionText.includes(englishName2)) {
          interactions.push({
            drug: drug1,
            interactingDrug: drug2,
            details: drug1Label.drug_interactions
          });
        }
      }
    }
    
    // 检查第二种药物的标签中是否提及第一种药物
    if (drug2Data.results && drug2Data.results.length > 0) {
      const drug2Label = drug2Data.results[0];
      console.log(`药物${drug2}的标签数据:`, drug2Label);
      
      if (drug2Label.drug_interactions) {
        const interactionText = drug2Label.drug_interactions.join(' ').toLowerCase();
        const englishName1 = (await translateDrugName(drug1)).toLowerCase();
        console.log(`检查${drug2}中是否包含${drug1}或${englishName1}:`, {
          interactionText,
          drug1: drug1.toLowerCase(),
          englishName1
        });
        
        if (interactionText.includes(drug1.toLowerCase()) || interactionText.includes(englishName1)) {
          interactions.push({
            drug: drug2,
            interactingDrug: drug1,
            details: drug2Label.drug_interactions
          });
        }
      }
    }
    
    console.log(`相互作用检查结果:`, interactions);
    
    return {
      drug1,
      drug2,
      interactionsFound: interactions.length > 0,
      interactions
    };
  } catch (error) {
    console.error('检查药物间相互作用时出错:', error);
    throw error;
  }
}

export default {
  searchDrugLabelByDrugName,
  searchDrugInteractionsByDrugName,
  getDrugInteractionsDetails,
  checkDrugDrugInteraction
};